package com.zhaojonhy.zhaopangwb.utils;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.zhaojonhy.zhaopangwb.R;
import com.zhaojonhy.zhaopangwb.ui.WebViewActivity;
import com.zhaojonhy.zhaopangwb.ui.UserInfoActivity;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by Administrator on 2016/9/17.
 * 获取微博特殊正文工具
 */

public class StringUtils {

    final static String TAG = StringUtils.class.getSimpleName() ;
    public static SpannableString getWeiboContent( final Context context , final TextView tv ,
                                                  String source){
        String regexAt = "@[\u4e00-\u9fa5\\w]+" ; //中文正则表达式加/w字符下划线,"+"代表一或多个,用来表示@用户
        String regexTopic = "#[\u4e00-\u9fa5\\w]+#" ; //微博话题正文
        String regexEmoji = "\\[[\u4e00-\u9fa5\\w]+\\]"; ; //微博表情
        //微博视频
        String regexVedio =
                "(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&amp;:/~\\+#]*[\\w\\-\\@?^=%&amp;/~\\+#])?" ;


        String regex = "(" + regexAt + ")|(" + regexTopic + ")|(" + regexEmoji + ")|("+regexVedio+")";;//用或符号连接，满足任意的规则都可

        SpannableString spannableString = new SpannableString(source) ;
        Log.d(TAG,"content "+source) ;
        // 正则匹配，传入正则规则和原字符创
        Pattern pattern = Pattern.compile(regex) ;
        Matcher matcher = pattern.matcher(spannableString) ;

        if(matcher.find()){
            tv.setMovementMethod(LinkMovementMethod.getInstance());//实现超链接的跳转
            matcher.reset() ;//重置，重新遍历
        }

        //循环遍历整个字符串
        while (matcher.find()) {
            //返回匹配到的子字符串
            final String atStr = matcher.group(1) ;
            final String topicStr = matcher.group(2) ;
             String emojiStr = matcher.group(3) ;
            final String vedioStr = matcher.group(4) ;
            Log.d(TAG,"emojiStr "+emojiStr) ;

            //因为用或遍历，所以要考虑到其中任意一个为空的情况
            if( atStr != null ) {
                int start = matcher.start(1) ;
                //@和topic都是用可点击事件

                WeiboClickableSpan clickableSpan = new WeiboClickableSpan(context){
                    @Override
                    public void onClick(View widget) {
                        Intent intent = new Intent(context,UserInfoActivity.class) ;
                        intent.putExtra("userName",atStr.substring(1)) ;
                        context.startActivity(intent);
                        ToastUtils.showToast(context,"用户："+atStr ,Toast.LENGTH_LONG);
                    }
                } ;

                spannableString.setSpan(clickableSpan,start,start+atStr.length(),
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }

            if( topicStr != null ) {
                int start = matcher.start(2) ;

                //@和topic都是用可点击事件
                WeiboClickableSpan clickableSpan = new WeiboClickableSpan(context){
                    @Override
                    public void onClick(View widget) {
                        ToastUtils.showToast(context,"话题："+topicStr ,Toast.LENGTH_LONG);
                    }
                } ;

                spannableString.setSpan(clickableSpan,start,start+topicStr.length(),
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }

            if( emojiStr != null ) {

                int imgRes = EmojiUtils.getImgByName(emojiStr) ;
                Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),imgRes) ;//第一个参数是包含你要加载的位图资源文件的对象
                // （一般写成 getResources（）就ok了）；第二个时你需要加载的位图资源的Id。

                if( bitmap != null ){ //进行非空判断
                    //对图片进行压缩(使图片和文字大小一致)
                    int size = (int)tv.getTextSize() ;
                    int start = matcher.start(3) ;
                    bitmap = Bitmap.createScaledBitmap(bitmap,size,size,true) ;
                    ImageSpan imageSpan = new ImageSpan(context,bitmap) ;
//                    object what ：对应的各种Span，后面会提到；
//                    int start：开始应用指定Span的位置，索引从0开始
//                    int end：结束应用指定Span的位置，特效并不包括这个位置。比如如果这里数为3（即第4个字符），第4个字符不会有任何特效。从下面的例子也可以- 看出来。
//                    int flags：取值有如下四个
//                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE：前后都不包括，即在指定范围的前面和后面插入新字符都不会应用新样式
//                    Spannable.SPAN_EXCLUSIVE_INCLUSIVE ：前面不包括，后面包括。即仅在范围字符的后面插入新字符时会应用新样式
//                    Spannable.SPAN_INCLUSIVE_EXCLUSIVE ：前面包括，后面不包括。
//                    Spannable.SPAN_INCLUSIVE_INCLUSIVE ：前后都包括。
                    spannableString.setSpan(imageSpan,start ,start+emojiStr.length() ,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }

            if( vedioStr != null ) {
                int start = matcher.start(4) ;

                WeiboClickableSpan clickableSpan = new WeiboClickableSpan(context){
                    @Override
                    public void onClick(View widget) {
                        ToastUtils.showToast(context,"视频："+ vedioStr ,Toast.LENGTH_LONG);
                        Intent intent = new Intent() ;
                        intent.putExtra("vedioStr",vedioStr) ;
                        intent.setClass(context, WebViewActivity.class) ;
                        context.startActivity(intent);
                    }
                } ;

                spannableString.setSpan(clickableSpan,start,start+vedioStr.length(),
                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }

        return spannableString ;
    }

    static class WeiboClickableSpan extends ClickableSpan{

        private Context context ;

        public WeiboClickableSpan(Context context) {
            this.context = context ;
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setColor(context.getResources().getColor(R.color.txt_at_blue)) ;
            ds.setUnderlineText(false);
        }
        @Override
        public void onClick(View widget) {

        }
    }

}
